Human Activity Recognition example¶
Aerobic actions were recorded from subjects using the Inertial Measurement Unit (IMU) on an Apple iPhone 4 smartphone. The IMU includes a 3D accelerometer, gyroscope, and magnetometer. Each sample was taken at 60Hz, and manually trimmed to 500 samples (8.33s) to eliminate starting and stopping movements. The iPhone was always clipped to the belt on the right hand side.
Each file contains 500 rows each with the following information: Acc_x, Acc_y, Acc_z, Gyr_x, Gyr_y, Gyr_z, Mag_x, Mag_y, Mag_z.
import numpy as np
import pandas as pd
import torch
import mogptk
torch.manual_seed(1);
MOGP prediction on the sensor values¶
We use each of the nine sensor's values as channel, leaving us with nine channels to fit using multi output Gaussian processes in order to find cross correlations between the channels.
Example 1: cycling¶
Example consisting of measurement for the 9 sensors at 60Hz, with 500 samples per channel, while the person is in a bike.
df = pd.read_csv('data/HAR/Smartphone_Dataset/S05/bike3.csv', header=None)
y = df.values
t = (np.arange(0, 500) / 60)
cols = ['Acc_x', 'Acc_y', 'Acc_z', 'Gyr_x', 'Gyr_y', 'Gyr_z', 'Mag_x', 'Mag_y', 'Mag_z']
data = mogptk.DataSet()
for i in range(9):
data.append(mogptk.Data(t, y[:, i], name=cols[i]))
Simulate sensor failure¶
# randomly sample from the data
for channel in data:
channel.remove_randomly(pct=0.7)
# drop chunks to simulate sensor failure
data[0].remove_range(None, 1)
data[1].remove_range(0.5, 1.2)
data[2].remove_range(7, None)
data[3].remove_range(7.5, None)
data[4].remove_range(7.5, None)
data[6].remove_range(4, 4.3)
data[7].remove_range(1, 2.3)
data[8].remove_range(4.5, 6)
data.transform(mogptk.TransformDetrend())
Create model¶
model = mogptk.MOSM(data, Q=5)
model.init_parameters('BNSE')
model.plot_spectrum();
model.plot_prediction(title='Untrained model | Subject 5 Bike 3');
Model training¶
model.train(method='Adam', lr=0.02, iters=1000, verbose=True, plot=True);
Starting optimization using Adam
‣ Model: Exact
‣ Kernel: MultiOutputSpectralMixtureKernel
‣ Likelihood: GaussianLikelihood
‣ Channels: 9
‣ Parameters: 234
‣ Training points: 1204
‣ Iterations: 1000
0/1000 0:00:13 loss= 582.192 (warmup)
2/1000 0:01:03 loss= 458.364
54/1000 0:01:10 loss= 313.862
129/1000 0:01:20 loss= 200.463
202/1000 0:01:30 loss= 125.206
279/1000 0:01:40 loss= 22.6574
363/1000 0:01:50 loss= -41.4176
448/1000 0:02:00 loss= -83.651
533/1000 0:02:10 loss= -108.979
618/1000 0:02:20 loss= -120.341
704/1000 0:02:30 loss= -133.578
778/1000 0:02:40 loss= -133.598
853/1000 0:02:50 loss= -139.304
926/1000 0:03:00 loss= -138.559
1000/1000 0:03:10 loss= -149.004
Optimization finished in 3 minutes 10 seconds
model.plot_prediction(title='Trained model | Subject 5 Bike 3');
Example 2: walking¶
Example consisting of measurement for the 9 sensors at 60Hz, with 500 samples per channel, while the person is walking.
df = pd.read_csv('data/HAR/Smartphone_Dataset/S01/walking2.csv', header=None)
y = df.values
t = np.arange(0, 500) / 60
data = mogptk.DataSet()
for i in range(9):
data.append(mogptk.Data(t, y[:, i], name=cols[i]))
# randomly sample from the data
for channel in data:
channel.remove_randomly(pct=0.7)
# drop chunks to simulate sensor failure
data[0].remove_range(None, 1)
data[1].remove_range(0.5, 1.2)
data[2].remove_range(7, None)
data[3].remove_range(7.5, None)
data[4].remove_range(7.5, None)
data[6].remove_range(4, 4.3)
data[7].remove_range(1, 2.3)
data[8].remove_range(4.5, 6)
data.transform(mogptk.TransformDetrend())
model = mogptk.MOSM(data, Q=3)
model.init_parameters('BNSE')
model.train(method='Adam', lr=0.015, iters=1500, verbose=True, plot=True);
Starting optimization using Adam
‣ Model: Exact
‣ Kernel: MultiOutputSpectralMixtureKernel
‣ Likelihood: GaussianLikelihood
‣ Channels: 9
‣ Parameters: 144
‣ Training points: 1205
‣ Iterations: 1500
0/1500 0:00:13 loss= 569.134 (warmup)
2/1500 0:01:03 loss= 438.994
58/1500 0:01:10 loss= 344
143/1500 0:01:20 loss= 250.777
228/1500 0:01:30 loss= 188.029
314/1500 0:01:40 loss= 146.638
399/1500 0:01:50 loss= 99.2743
481/1500 0:02:00 loss= 73.5437
556/1500 0:02:10 loss= 56.1977
631/1500 0:02:20 loss= 43.1375
704/1500 0:02:30 loss= 61.4399
779/1500 0:02:40 loss= 33.1814
854/1500 0:02:50 loss= 31.0374
928/1500 0:03:00 loss= 34.1956
1002/1500 0:03:10 loss= 25.1144
1077/1500 0:03:20 loss= 16.9546
1153/1500 0:03:30 loss= 15.698
1227/1500 0:03:40 loss= 16.3419
1301/1500 0:03:50 loss= 36.7494
1376/1500 0:04:00 loss= 15.4061
1451/1500 0:04:10 loss= 15.3953
1500/1500 0:04:16 loss= 17.7313
Optimization finished in 4 minutes 16 seconds
model.plot_prediction(title='Trained model | Subject 1 walking 2');